home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Hacking & Misc / bundle of exploits.sit / bundle of exploits / rootkits / rootkit / ns.c < prev    next >
Text File  |  1994-03-01  |  6KB  |  238 lines

  1. /*
  2.  * Copyright (c) 1983 Regents of the University of California.
  3.  * All rights reserved.  The Berkeley software License Agreement
  4.  * specifies the terms and conditions for redistribution.
  5.  */
  6.  
  7. #ifndef lint
  8. static    char sccsid[] = "@(#)ns.c 1.1 91/11/13 SMI"; /* from UCB 5.3 9/12/85 */
  9. #endif
  10.  
  11. #ifdef    ENABLE_XNS
  12.  
  13. #include <stdio.h>
  14. #include <errno.h>
  15. #include <nlist.h>
  16.  
  17. #include <sys/types.h>
  18. #include <sys/socket.h>
  19. #include <sys/socketvar.h>
  20. #include <sys/mbuf.h>
  21. #include <sys/protosw.h>
  22.  
  23. #include <net/route.h>
  24. #include <net/if.h>
  25.  
  26. #include <netinet/tcp_fsm.h>
  27. #include <netinet/tcp_timer.h>
  28.  
  29. #include <netns/ns.h>
  30. #include <netns/ns_pcb.h>
  31. #include <netns/idp.h>
  32. #include <netns/idp_var.h>
  33. #include <netns/ns_error.h>
  34. #include <netns/sp.h>
  35. #include <netns/spidp.h>
  36. #include <netns/spp_var.h>
  37. #define SANAMES
  38. #include <netns/spp_debug.h>
  39.  
  40.  
  41. struct    nspcb nspcb;
  42. struct    sppcb sppcb;
  43. struct    socket sockb;
  44. struct    protosw proto;
  45. extern    int kread();
  46. extern    int Aflag;
  47. extern    int aflag;
  48. extern    int nflag;
  49. char *ns_prpr();
  50.  
  51. static    int first = 1;
  52.  
  53. /*
  54.  * Print a summary of connections related to a Network Systems
  55.  * protocol.  For SPP, also give state of connection.
  56.  * Listening processes (aflag) are suppressed unless the
  57.  * -a (all) flag is specified.
  58.  */
  59.  
  60. nsprotopr(off, name)
  61.     off_t off;
  62.     char *name;
  63. {
  64.     struct nspcb cb;
  65.     register struct nspcb *prev, *next;
  66.     int isspp;
  67.  
  68.     if (off == 0)
  69.         return;
  70.     isspp = strcmp(name, "spp") == 0;
  71.     kread(off, &cb, sizeof (struct nspcb));
  72.     nspcb = cb;
  73.     prev = (struct nspcb *)off;
  74.     if (nspcb.nsp_next == (struct nspcb *)off)
  75.         return;
  76.     for (;nspcb.nsp_next != (struct nspcb *)off; prev = next) {
  77.         char *cp;
  78.         off_t ppcb;
  79.  
  80.         next = nspcb.nsp_next;
  81.         kread((off_t)next, &nspcb, sizeof (nspcb));
  82.         if (nspcb.nsp_prev != prev) {
  83.             printf("???\n");
  84.             break;
  85.         }
  86.         if (!aflag && ns_nullhost(nspcb.nsp_faddr) ) {
  87.             continue;
  88.         }
  89.         kread((off_t)nspcb.nsp_socket, &sockb, sizeof (sockb));
  90.         ppcb = (off_t) nspcb.nsp_pcb;
  91.         if (ppcb) {
  92.             if (isspp) {
  93.                 kread(ppcb, &sppcb, sizeof (sppcb));
  94.             } else continue;
  95.         } else
  96.             if (isspp) continue;
  97.         if (first) {
  98.             printf("Active NS connections");
  99.             if (aflag)
  100.                 printf(" (including servers)");
  101.             putchar('\n');
  102.             if (Aflag)
  103.                 printf("%-8.8s ", "PCB");
  104.             printf(Aflag ?
  105.                 "%-5.5s %-6.6s %-6.6s  %-18.18s %-18.18s %s\n" :
  106.                 "%-5.5s %-6.6s %-6.6s  %-22.22s %-22.22s %s\n",
  107.                 "Proto", "Recv-Q", "Send-Q",
  108.                 "Local Address", "Foreign Address", "(state)");
  109.             first = 0;
  110.         }
  111.         if (Aflag)
  112.             printf("%8x ", ppcb);
  113.         printf("%-5.5s %6d %6d ", name, sockb.so_rcv.sb_cc,
  114.             sockb.so_snd.sb_cc);
  115.         printf("  %-22.22s", ns_prpr(&nspcb.nsp_laddr));
  116.         printf(" %-22.22s", ns_prpr(&nspcb.nsp_faddr));
  117.         if (isspp) {
  118.             extern char *tcpstates[];
  119.             if (sppcb.s_state < 0 || sppcb.s_state >= TCP_NSTATES)
  120.                 printf(" %d", sppcb.s_state);
  121.             else
  122.                 printf(" %s", tcpstates[sppcb.s_state]);
  123.         }
  124.         putchar('\n');
  125.         prev = next;
  126.     }
  127. }
  128. #define ANY(x,y,z)  ((x) ? printf("\t%d %s%s%s\n",x,y,plural(x),z) : 0)
  129.  
  130. /*
  131.  * Dump SPP statistics structure.
  132.  */
  133. spp_stats(off, name)
  134.     off_t off;
  135.     char *name;
  136. {
  137.     struct spp_istat spp_istat;
  138.  
  139.     if (off == 0)
  140.         return;
  141.     kread(off, (char *)&spp_istat, sizeof (spp_istat));
  142.     printf("%s:\n", name);
  143.     ANY(spp_istat.nonucn, "connection", " dropped due to no new sockets ");
  144.     ANY(spp_istat.gonawy, "connection", " terminated due to our end dying");
  145.     ANY(spp_istat.nonucn, "connection", " dropped due to inability to connect");
  146.     ANY(spp_istat.noconn, "connection", " dropped due to inability to connect");
  147.     ANY(spp_istat.notme, "connection", " incompleted due to mismatched id's");
  148.     ANY(spp_istat.wrncon, "connection", " dropped due to mismatched id's");
  149.     ANY(spp_istat.bdreas, "packet", " dropped out of sequence");
  150.     ANY(spp_istat.lstdup, "packet", " duplicating the highest packet");
  151.     ANY(spp_istat.notyet, "packet", " refused as exceeding allocation");
  152. }
  153.  
  154. /*
  155.  * Dump IDP statistics structure.
  156.  */
  157. idp_stats(off, name)
  158.     off_t off;
  159.     char *name;
  160. {
  161.     struct idpstat idpstat;
  162.  
  163.     if (off == 0)
  164.         return;
  165.     kread(off, (char *)&idpstat, sizeof (idpstat));
  166.     ANY(idpstat.idps_toosmall, "packet", " smaller than a header");
  167.     ANY(idpstat.idps_tooshort, "packet", " smaller than advertised");
  168.     ANY(idpstat.idps_badsum, "packet", " with bad checksums");
  169. }
  170.  
  171. static    char *((ns_errnames[])[2]) = {
  172.     {"Unspecified Error", " at Destination"},
  173.     {"Bad Checksum", " at Destination"},
  174.     {"No Listener", " at Socket"},
  175.     {"Packet", " Refused due to lack of space at Destination"},
  176.     {"Unspecified Error", " while gatewayed"},
  177.     {"Bad Checksum", " while gatewayed"},
  178.     {"Packet", " forwarded too many times"},
  179.     {"Packet", " too large to be forwarded"},
  180. };
  181.  
  182. /*
  183.  * Dump NS Error statistics structure.
  184.  */
  185. nserr_stats(off, name)
  186.     off_t off;
  187.     char *name;
  188. {
  189.     struct ns_errstat ns_errstat;
  190.     register int j;
  191.     register int histoprint = 1;
  192.     int z;
  193.  
  194.     if (off == 0)
  195.         return;
  196.     kread(off, (char *)&ns_errstat, sizeof (ns_errstat));
  197.     printf("NS error statistics:\n");
  198.     ANY(ns_errstat.ns_es_error, "call", " to ns_error");
  199.     ANY(ns_errstat.ns_es_oldshort, "error",
  200.         " ignored due to insufficient addressing");
  201.     ANY(ns_errstat.ns_es_oldns_err, "error request",
  202.         " in response to error packets");
  203.     ANY(ns_errstat.ns_es_tooshort, "error packet",
  204.         " received incomplete");
  205.     ANY(ns_errstat.ns_es_badcode, "error packet",
  206.         " received of unknown type");
  207.     for(j = 0; j < NS_ERR_MAX; j ++) {
  208.         z = ns_errstat.ns_es_outhist[j];
  209.         if (z && histoprint) {
  210.             printf("Output Error Histogram:\n");
  211.             histoprint = 0;
  212.         }
  213.         ANY(z, ns_errnames[j][0], ns_errnames[j][1]);
  214.     }
  215.     histoprint = 1;
  216.     for(j = 0; j < NS_ERR_MAX; j ++) {
  217.         z = ns_errstat.ns_es_inhist[j];
  218.         if (z && histoprint) {
  219.             printf("Input Error Histogram:\n");
  220.             histoprint = 0;
  221.         }
  222.         ANY(z, ns_errnames[j][0], ns_errnames[j][1]);
  223.     }
  224. }
  225. static struct sockaddr_ns ssns = {AF_NS};
  226.  
  227. char *ns_prpr(x)
  228. struct ns_addr *x;
  229. {
  230.     extern char *ns_print();
  231.     struct sockaddr_ns *sns = &ssns;
  232.     sns->sns_addr = *x;
  233.     return(ns_print(sns));
  234. }
  235.  
  236. #endif    ENABLE_XNS
  237.  
  238.